home *** CD-ROM | disk | FTP | other *** search
/ Freelog 121 / FreelogMagazineJuilletAout2014-No121.iso / Outils / Adobe-Air / adobe-air_13.exe / [0] / setup.swf / scripts / mx / binding / PropertyWatcher.as < prev    next >
Text File  |  2014-03-27  |  5KB  |  178 lines

  1. package mx.binding
  2. {
  3.    import flash.events.Event;
  4.    import flash.events.IEventDispatcher;
  5.    import flash.utils.getQualifiedClassName;
  6.    import mx.core.EventPriority;
  7.    import mx.core.mx_internal;
  8.    import mx.events.PropertyChangeEvent;
  9.    import mx.utils.DescribeTypeCache;
  10.    
  11.    use namespace mx_internal;
  12.    
  13.    public class PropertyWatcher extends Watcher
  14.    {
  15.       
  16.       mx_internal static const VERSION:String = "3.0.0.0";
  17.        
  18.       
  19.       protected var propertyGetter:Function;
  20.       
  21.       private var parentObj:Object;
  22.       
  23.       protected var events:Object;
  24.       
  25.       private var useRTTI:Boolean;
  26.       
  27.       private var _propertyName:String;
  28.       
  29.       public function PropertyWatcher(param1:String, param2:Object, param3:Array, param4:Function = null)
  30.       {
  31.          super(param3);
  32.          _propertyName = param1;
  33.          this.events = param2;
  34.          this.propertyGetter = param4;
  35.          useRTTI = !param2;
  36.       }
  37.       
  38.       private function eventNamesToString() : String
  39.       {
  40.          var _loc2_:* = null;
  41.          var _loc1_:String = " ";
  42.          for(_loc2_ in events)
  43.          {
  44.             _loc1_ += _loc2_ + " ";
  45.          }
  46.          return _loc1_;
  47.       }
  48.       
  49.       override public function updateParent(param1:Object) : void
  50.       {
  51.          var _loc2_:* = null;
  52.          var _loc3_:BindabilityInfo = null;
  53.          if(parentObj && parentObj is IEventDispatcher)
  54.          {
  55.             for(_loc2_ in events)
  56.             {
  57.                parentObj.removeEventListener(_loc2_,eventHandler);
  58.             }
  59.          }
  60.          if(param1 is Watcher)
  61.          {
  62.             parentObj = param1.value;
  63.          }
  64.          else
  65.          {
  66.             parentObj = param1;
  67.          }
  68.          if(parentObj)
  69.          {
  70.             if(useRTTI)
  71.             {
  72.                events = {};
  73.                if(parentObj is IEventDispatcher)
  74.                {
  75.                   _loc3_ = DescribeTypeCache.describeType(parentObj).bindabilityInfo;
  76.                   events = _loc3_.getChangeEvents(_propertyName);
  77.                   if(objectIsEmpty(events))
  78.                   {
  79.                      trace("warning: unable to bind to property \'" + _propertyName + "\' on class \'" + getQualifiedClassName(parentObj) + "\'");
  80.                   }
  81.                   else
  82.                   {
  83.                      addParentEventListeners();
  84.                   }
  85.                }
  86.                else
  87.                {
  88.                   trace("warning: unable to bind to property \'" + _propertyName + "\' on class \'" + getQualifiedClassName(parentObj) + "\' (class is not an IEventDispatcher)");
  89.                }
  90.             }
  91.             else if(parentObj is IEventDispatcher)
  92.             {
  93.                addParentEventListeners();
  94.             }
  95.          }
  96.          wrapUpdate(updateProperty);
  97.       }
  98.       
  99.       private function objectIsEmpty(param1:Object) : Boolean
  100.       {
  101.          var _loc2_:* = null;
  102.          var _loc3_:int = 0;
  103.          var _loc4_:* = param1;
  104.          for(_loc2_ in _loc4_)
  105.          {
  106.             return false;
  107.          }
  108.          return true;
  109.       }
  110.       
  111.       override protected function shallowClone() : Watcher
  112.       {
  113.          return new PropertyWatcher(_propertyName,events,listeners,propertyGetter);
  114.       }
  115.       
  116.       private function traceInfo() : String
  117.       {
  118.          return "Watcher(" + getQualifiedClassName(parentObj) + "." + _propertyName + "): events = [" + eventNamesToString() + (!!useRTTI ? "] (RTTI)" : "]");
  119.       }
  120.       
  121.       public function get propertyName() : String
  122.       {
  123.          return _propertyName;
  124.       }
  125.       
  126.       private function addParentEventListeners() : void
  127.       {
  128.          var _loc1_:* = null;
  129.          for(_loc1_ in events)
  130.          {
  131.             if(_loc1_ != "__NoChangeEvent__")
  132.             {
  133.                parentObj.addEventListener(_loc1_,eventHandler,false,EventPriority.BINDING,true);
  134.             }
  135.          }
  136.       }
  137.       
  138.       private function updateProperty() : void
  139.       {
  140.          if(parentObj)
  141.          {
  142.             if(_propertyName == "this")
  143.             {
  144.                value = parentObj;
  145.             }
  146.             else if(propertyGetter != null)
  147.             {
  148.                value = propertyGetter.apply(parentObj,[_propertyName]);
  149.             }
  150.             else
  151.             {
  152.                value = parentObj[_propertyName];
  153.             }
  154.          }
  155.          else
  156.          {
  157.             value = null;
  158.          }
  159.          updateChildren();
  160.       }
  161.       
  162.       public function eventHandler(param1:Event) : void
  163.       {
  164.          var _loc2_:Object = null;
  165.          if(param1 is PropertyChangeEvent)
  166.          {
  167.             _loc2_ = PropertyChangeEvent(param1).property;
  168.             if(_loc2_ != _propertyName)
  169.             {
  170.                return;
  171.             }
  172.          }
  173.          wrapUpdate(updateProperty);
  174.          notifyListeners(events[param1.type]);
  175.       }
  176.    }
  177. }
  178.